/*
 * JVM_OpcodeLogic.c
 *
 *  Created on: 04.01.2011
 *      Author: Tavin
 */

#include <stdint.h>

#include "JVM_StatusCodes.h"
#include "JVM_Opcode.h"
#include "JVM_OpcodeLogic.h"

/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_ishl									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_ishl()
{
	uint32_t myValue1;
	uint32_t myValue2;


	myValue2=JVM_Opcode_popIntValue();
	myValue1=JVM_Opcode_popIntValue();

	myValue2&=0x1f;

	myValue1<<=myValue2;

	JVM_Opcode_pushIntValue(myValue1);

	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_lshl									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_lshl()
{
	uint64_t myValue1;
	uint64_t myValue2;


	myValue2=JVM_Opcode_popLongValue();
	myValue1=JVM_Opcode_popLongValue();

	myValue2&=0x3f;

	myValue1<<=myValue2;

	JVM_Opcode_pushLongValue(myValue1);

	return(STCD_OK);

}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_ishr									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_ishr()
{
	uint32_t myValue1;
	uint32_t myValue2;
	uint32_t resoult;

	myValue2=JVM_Opcode_popIntValue();
	myValue1=JVM_Opcode_popIntValue();



	myValue2&=0x3f;


	resoult=myValue1>>myValue2;

	if ((myValue1 & ((uint32_t)1<<31)) >0)
		resoult|=(-1<<(31-myValue2));


	JVM_Opcode_pushIntValue(resoult);

	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_lshr									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_lshr()
{
	uint64_t myValue1;
	uint64_t myValue2;
	uint64_t resoult;

	myValue2=JVM_Opcode_popLongValue();
	myValue1=JVM_Opcode_popLongValue();



	myValue2&=0x3f;


	resoult=myValue1>>myValue2;

	if ((myValue1 & ((uint64_t)1<<63)) >0)
		resoult|=(-1<<(63-myValue2));


	JVM_Opcode_pushLongValue(resoult);

	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_iushr								Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/


uint16_t JVM_cmd_iushr()
{

	uint32_t myValue1;
	uint32_t myValue2;


	myValue2=JVM_Opcode_popIntValue();
	myValue1=JVM_Opcode_popIntValue();

	myValue2&=0x1f;

	myValue1>>=myValue2;

	JVM_Opcode_pushIntValue(myValue1);

	return(STCD_OK);
	return(STCD_OK);

}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_lushr								Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_lushr()
{
	uint64_t myValue1;
	uint64_t myValue2;


	myValue2=JVM_Opcode_popLongValue();
	myValue1=JVM_Opcode_popLongValue();

	myValue2&=0x3f;

	myValue1>>=myValue2;

	JVM_Opcode_pushLongValue(myValue1);

	return(STCD_OK);

	return(STCD_OK);

}



/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_iand									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/


uint16_t JVM_cmd_iand()
{

	uint32_t myInt1;
	uint32_t myInt2;


	myInt1=JVM_Opcode_popIntValue();
	myInt2=JVM_Opcode_popIntValue();

	myInt1&=myInt2;

	JVM_Opcode_pushIntValue(myInt1);

	return(STCD_OK);

}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_land									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_land()
{
	uint64_t myLong1;
	uint64_t myLong2;


	myLong1=JVM_Opcode_popLongValue();
	myLong2=JVM_Opcode_popLongValue();

	myLong1&=myLong2;

	JVM_Opcode_pushLongValue(myLong1);

	return(STCD_OK);

}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_ior									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/


uint16_t JVM_cmd_ior()
{
	uint32_t myInt1;
	uint32_t myInt2;


	myInt1=JVM_Opcode_popIntValue();
	myInt2=JVM_Opcode_popIntValue();

	myInt1|=myInt2;

	JVM_Opcode_pushIntValue(myInt1);

	return(STCD_OK);

}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_lor									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_lor()
{
	uint64_t myLong1;
	uint64_t myLong2;


	myLong1=JVM_Opcode_popLongValue();
	myLong2=JVM_Opcode_popLongValue();

	myLong1|=myLong2;

	JVM_Opcode_pushLongValue(myLong1);

	return(STCD_OK);

}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_ixor									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/


uint16_t JVM_cmd_ixor(){

	uint32_t myInt1;
	uint32_t myInt2;


	myInt1=JVM_Opcode_popIntValue();
	myInt2=JVM_Opcode_popIntValue();

	myInt1^=myInt2;

	JVM_Opcode_pushIntValue(myInt1);
	return(STCD_OK);

}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_lxor									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_lxor()
{
	uint64_t myLong1;
	uint64_t myLong2;


	myLong1=JVM_Opcode_popLongValue();
	myLong2=JVM_Opcode_popLongValue();

	myLong1^=myLong2;

	JVM_Opcode_pushLongValue(myLong1);

	return(STCD_OK);

}

